package com.sq.partner.manager.dao;	
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.sq.partner.manager.util.Page;


/**
 * 基础dao类
 * 用于封装一些基本的操作
 * @author fshitd04
 * May 20, 2013
 */
public interface BaseDao{
	/**
	 * 执行存储过程/函数
	 * 返回结果请从para中取
	 * @param <T>
	 * @param statementName  Sql配置名
	 * @param para 参数,根据配置文件需要，结果也从中获取
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public <T>  void call(String statementName,Map para) throws SQLException;

	/**
	 * 使用ibatis查询返回对像
	 * @param <T>
	 * @param statementName  Sql配置名
	 * @param para 参数,根据配置文件需要，可以传Bean,Map,简单类型等
	 * @return
	 * @throws Exception
	 */
	public <T>  Object query(String statementName,T para) throws SQLException;
	
	/**
	 * 使用sql查询返回对像
	 * @param sql sql
	 * @param params 参数列表用于按顺序替换?
	 * @return 查询结果字段对应的map，其key不分大小写
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public Map query(String sql,Object[] params) throws SQLException;
	
	/**
	 * 查询,返回List
	 * @param <T>
	 * @param statementName Sql配置名
	 * @param para 参数,根据配置文件需要，可以传Bean,Map,简单类型等
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public <T>  List queryList(String statementName,T para) throws SQLException;
	
	/**
	 * @param sql sql
	 * @param params 参数列表用于按顺序替换?
	 * @return List<Map> map查询结果与字段对应的，其key不分大小写
	 * @throws Exception
	 */
	@SuppressWarnings("rawtypes")
	public List<Map> queryList(String sql,Object[] params) throws SQLException;
	
	/**
	 * 
	 * @param current 当前页
	 * @param clumnNames　SQL元素：字段名，多个以逗号隔开
	 * @param tableNames　SQL元素表名，多个以逗号隔开
	 * @param whereCluse SQL元素where条件
	 * @param orderByCluse SQL元素 ordrBy条件
	 * @param params 参数列表用于按顺序替换?
	 * @return
	 * @throws Exception
	 */
	public Page queryPage(int current,String clumnNames,String tableNames,String whereCluse,String orderByCluse,Object[] params) throws SQLException;
	
	/**
	 * 查询,返回page对像
	 * 描述性sql:select clumnNames from tableNames where whereCluse orderby orderByCluse,使用size和current进行分页
	 * @param statementName Sql配置名
	 * @param para 参数,根据配置文件需要，可以传Bean,Map,简单类型等
	 * @return
	 * @throws Exception
	 */
	public Page queryPage(int current,int size,String clumnNames,String tableNames,String whereCluse,String orderByCluse,Object[] params) throws SQLException;
	
	public String transColumn(String tableName,String fromColumn,String toColumn,Object fromValue) throws SQLException;
	
	/**
	 * 添加
	 * @param <T>
	 * @param statementName Sql配置名
	 * @param entity 操作对像
	 * @return
	 * @throws Exception
	 */
	public <T>  boolean  add(String statementName,T entity) throws Exception;
	
	
	/**
	 * 添加并自动更新fcd fcu lcd lcu 如果有的对应set方法
	 * @param <T>
	 * @param statementName Sql配置名
	 * @param entity 操作对像
	 * @param user 用户名
	 * @return
	 * @throws Exception
	 */
	public <T>  boolean  add(String statementName,T entity,String user) throws Exception;
	
	/**
	 * 更新
	 * @param <T>
	 * @param statementName Sql配置名
	 * @param entity 操作对像
	 * @return
	 * @throws Exception
	 */
	public <T>  boolean  update(String statementName,T entity) throws Exception;
	
	/**
	 * 更新并自动更新lcd lcu 如果有的对应set方法
	 * @param <T>
	 * @param statementName Sql配置名
	 * @param entity 操作对像
	 * @param user 用户名
	 * @return
	 * @throws Exception
	 */
	public <T>  boolean  update(String statementName,T entity,String user) throws Exception;
	
	/**
	 * 更新
	 * @param statementName Sql配置名
	 * @param entity 操作对像,以statementName要求为准
	 * @return
	 * @throws Exception
	 */
	public <T>  boolean  delete(String statementName,T entity) throws Exception;
	
    /**
     * 批量删除
     * @param statementName    sql文件ID
     * @param list             参数集合
     */

    @SuppressWarnings("rawtypes")
	public void batchDelete(final String statementName, final List list) throws Exception;
	
    /**
     * 批量修改
     * @param statementName  sql文件ID
     * @param list           参数集合
     */
    @SuppressWarnings("rawtypes")
	public void batchUpdate(final String statementName, final List list) throws Exception;
    
    /**
     * 批量添加
     * @param statementName sql文件ID
     * @param list   参数集合
     */
    @SuppressWarnings("rawtypes")
	public void batchInsert(final String statementName, final List list) throws Exception;
    
    /**
     * 从DataSourct获取受spring事务管理的connection
     * @return
     * @throws Exception
     */
    public Connection getConnection() throws Exception;
    
    public <T>  Object  addAndReturnPrimaryKey(String statementName,T entity) throws Exception;
}
